package annotation;

public class LiLun {
        /*
        注解
            什么是注解
                注解（Annotation）是一种元数据（metadata）机制
                可以使用注解来为代码中的各个部分添加额外的信息，以帮助程序的编译、运行后者其他处理过程。
            Java注解可以用于
                为代码提供元数据信息，例如文档、版本号等。
                为编译器提供指示，例如抑制警告、生成代码等。
                为运行时提供指示，例如启用事务、配置参数等。
            注解功能一般都是使用Java反射API解析实现。
            Java注解为Java开发带来了很多好处，可以提高代码的可读性、可维护性和可靠性，从未使开发变的更加高效和轻松。
     */

    /*
        注解的定义
            注解必须先定义后使用
            定义注解的语法：
                public @interface AutoRunClass{
                }
                关键字，注意前面有一个@ 注解名
     */

    /*
        注解的应用
            在Java中，注解可以被应用于以下位置：
                类（Class）：可以在类上使用注解来提供类级别的元数据信息。
                方法（Method）：可以在方法上使用注解来提供方法级别的元数据信息。
                字段（Field）：可以在字段上上使用注解来提供字段级别的元数据信息。
                构造方法（Constructor）：可以在构造方法上使用注解来提供构造方法级别的元数据信息。
                变量（LocalVariable）：可以在变量上使用注解来提供变量级别的元数据信息。
                参数（Parameter）：可以在方法的参数上使用注解来提供参数级别的元数据信息。
                包（Package）：可以在包上使用注解来提供包级别的元数据信息。
                注解（Annotation）：可以在一个注解上使用注解来提供对注解的元数据信息。
     */

    /*
        常用的元注解
            元注解是JAV定义的永远忽说明注解的注解
            @Target：指明注解可以应用的元素类型
                使用枚举类ElementType来制定位置，取值有：
                    TYPE、FIELD、METHOD、PARAMETER、CONSTRUCTOR、LOCAL_VARIABLE、ANNOTATION_TYPE、PACKAGE
                如果没有制定@Target，则注解可以应用于所有元素类型。
                需要注意的是，如果指明应用位置是在类上：
                    使用ElementType.TYPE，该枚举没有定义ElementType.CLASS
     */

    /*
        @Target
            使用@Target为注解指明可以被标注的位置
                @Target(ElementType.TYPE) 只能在类上使用注解
                public @interface AutoRunClass{
                }
            该注解在没有指明的位置使用时则编译不通过。
            可以在多个位置使用
                @Target({ElementType.TYPE，ElementType.METHOD}) 以数组形式传递多个位置
                public @interface AutoRunClass{
                }
     */

    /*
        @Retention
            @Retention：指明注解的保留策略
                注解是否会被编译器保留到编译后的类文件中，以及在运行时是否可以通过反射获取注解信息。
                使用枚举类RetentionPolicy来制定保留级别，它有三个取值：
                    SOURCE（源代码保留，编译时被丢弃）
                    CLASS（编译期保留）
                    RUNTIME（运行期保留，可以通过反射获取）
                如果没有制定@Retention，则默认为CLASS
                在反射机制使用时必须是RUNTIME级别
                使用@Retention为注解指明保留级别
                    @Target(ElementType.TYPE)
                    @Retention(RetentionPolicy.RUNTIME) 只有RUNTIME级别注解才可被反射机制访问
                    public @interface AutoRunClass{
                    }
     */

    /*
        反射机制访问注解
            所有反射对象都支持判断其表示内容是否被制定注解标注
                boolean isAnnotationPresent(Class cls)
                    如果反射对象表示的内容被标注则返回true，否则返回false。
                    参数：判断被标注的注解的类对象。
     */

    /*
        注解定义参数
            注解可以定义参数，格式如下：
                类型 参数名 ()[default 默认值]
                @Target(ElementType.METHOD)
                @Retention(RetentionPolicy.RUNTIME)
                public @interface AutoRunMethod{
                    int value() default 1;
                }
     */

    /*
        反射机制访问注解传参
            所有反射对象都支持获取其表示内容上制定的注解
                Annotation getAnnotation(Class cls)
                    返回当前反射对象表示的内容制定的注解。
                    参数：指定注解所对应的类对象
     */
}












